package com.yang.semaphore;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * 信号量基础示例
 * 信号量(Semaphore)是一种计数信号量，用于控制同时访问特定资源的线程数量
 */
public class SemaphoreBasicExample {
    
    // 创建一个许可数为3的信号量，表示最多允许3个线程同时访问资源
    private static final Semaphore semaphore = new Semaphore(3);
    
    public static void main(String[] args) {
        // 创建10个线程来模拟并发访问
        for (int i = 1; i <= 10; i++) {
            Thread thread = new Thread(new Worker(i));
            thread.start();
        }
    }
    
    static class Worker implements Runnable {
        private final int workerId;
        
        public Worker(int workerId) {
            this.workerId = workerId;
        }
        
        @Override
        public void run() {
            try {
                System.out.println("工作者 " + workerId + " 正在等待获取许可...");
                
                // 获取许可，如果没有可用许可则阻塞等待
                semaphore.acquire();
                
                System.out.println("工作者 " + workerId + " 获得许可，开始工作");
                
                // 模拟工作时间
                Thread.sleep(2000);
                
                System.out.println("工作者 " + workerId + " 完成工作，释放许可");
                
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                System.out.println("工作者 " + workerId + " 被中断");
            } finally {
                // 释放许可，让其他等待的线程可以获取
                semaphore.release();
            }
        }
    }
}
